import axios from "axios";

// 创建一个axios实例
const http = axios.create({
  // baseURL: process.env.NODE_ENV == 'development' ? '/api' : '',
  baseURL: import.meta.env.VITE_API_BASE_URL,
  timeout: 6000,
  headers: { "X-Custom-Header": "foobar" },
});

// 添加请求拦截器
http.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    //请求头携带token
    if (localStorage.getItem("accessToken")) {
      config.headers["Authorization"] =
        "Bearer " + localStorage.getItem("accessToken");
    }
    return config;
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
http.interceptors.response.use(
  async function (response) {
    if (response.data.code != 200) {
      if (response.data.code == 304) {
        return Promise.reject("缓存");
      } else if (response.data.code == 401) {
        //第一种处理方式 清除本地token所有信息，重新跳转到首页
        // localStorage.clear()
        // window.location.href = "/"
        // return Promise.reject('token过期')

        
        //第二种处理方式 无感刷新
        return Promise.reject('token过期')
        //调用刷新令牌接口，拿到新的accessToken值
        const res = await refreshTokenFun();
        // 拿到一个新的accessToken值
        const accessToken = res.data.data.accessToken;
        // 把新拿到的accessToken替换掉本地存储的过期的accessToken
        localStorage.setItem("accessToken", accessToken);
        // 请求头的accessToken也替换
        response.config.headers.Authorization = "Bearer " + accessToken;
        return http(response.config);
      } else if (response.data.code == 403) {
        return Promise.reject("暂无权限");
      } else if (response.data.code == 404) {
        return Promise.reject("没找到");
      } else if (response.data.code == 500) {
        return Promise.reject("服务器有误");
      }
    }

    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response;
  },
  function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  }
);

// 1、用刷新令牌refreshToken拿到一个新的accessToken值
const refreshTokenFun = () => {
  return http.get("/refreshToken", {
    params: {
      refreshToken: localStorage.getItem("refreshToken"),
    },
  });
};

export default http;
